﻿// LkEsquinaMundo.cs
// Copyright 2009 Edgar Said Hernández Sánchez (Limo Wan Kenobi)
// limowankenobi@gmail.com
// http://lnkarel.sourceforge.net/
// http://limotonterias.blogspot.com/

/**
 * This file is part of LNKarel.
 *  
 * LNKarel is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 3 of the License, or
 * (at your option) any later version.
 * 
 * LNKarel is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 * 
 * You should have received a copy of the GNU General Public License
 * along with LNKarel.  If not, see <http://www.gnu.org/licenses/>.
 **/

using System;

namespace LMSoft.NKarel.Core
{
    public class LkEsquinaMundo
    {
        [Flags]
        internal enum LocalizacionParedes
        {
            Ninguna = 0,
            Norte = 1,
            Este = 2,
            Sur = 4,
            Oeste = 8
        }
        
        public LkEsquinaMundo()
        {
        }

        public LkEsquinaMundo(int cantBeepers)
            : this(cantBeepers, LocalizacionParedes.Ninguna)
        {
        }

        internal LkEsquinaMundo(int cantBeepers, LocalizacionParedes paredes)
        {
            CantBeepers = cantBeepers;
            Paredes = paredes;
        }

        internal LocalizacionParedes Paredes
        {
            get;
            set;
        }

        public int CantBeepers
        {
            get;
            set;
        }

        public bool ParedAlNorte
        {
            get
            {
                return ((Paredes & LocalizacionParedes.Norte) == LocalizacionParedes.Norte);
            }
            set
            {
                if (value)
                {
                    if ((Paredes & LocalizacionParedes.Norte) != LocalizacionParedes.Norte)
                    {
                        Paredes |= LocalizacionParedes.Norte;
                    }
                }
                else
                {
                    if ((Paredes & LocalizacionParedes.Norte) == LocalizacionParedes.Norte)
                    {
                        Paredes ^= LocalizacionParedes.Norte;
                    }
                }
            }
        }

        public bool ParedAlSur
        {
            get
            {
                return ((Paredes & LocalizacionParedes.Sur) == LocalizacionParedes.Sur);
            }
            set
            {
                if (value)
                {
                    if ((Paredes & LocalizacionParedes.Sur) != LocalizacionParedes.Sur)
                    {
                        Paredes |= LocalizacionParedes.Sur;
                    }
                }
                else
                {
                    if ((Paredes & LocalizacionParedes.Sur) == LocalizacionParedes.Sur)
                    {
                        Paredes ^= LocalizacionParedes.Sur;
                    }
                }
            }
        }

        public bool ParedAlEste
        {
            get
            {
                return ((Paredes & LocalizacionParedes.Este) == LocalizacionParedes.Este);
            }
            set
            {
                if (value)
                {
                    if ((Paredes & LocalizacionParedes.Este) != LocalizacionParedes.Este)
                    {
                        Paredes |= LocalizacionParedes.Este;
                    }
                }
                else
                {
                    if ((Paredes & LocalizacionParedes.Este) == LocalizacionParedes.Este)
                    {
                        Paredes ^= LocalizacionParedes.Este;
                    }
                }
            }
        }

        public bool ParedAlOeste
        {
            get
            {
                return ((Paredes & LocalizacionParedes.Oeste) == LocalizacionParedes.Oeste);
            }
            set
            {
                if (value)
                {
                    if ((Paredes & LocalizacionParedes.Oeste) != LocalizacionParedes.Oeste)
                    {
                        Paredes |= LocalizacionParedes.Oeste;
                    }
                }
                else
                {
                    if ((Paredes & LocalizacionParedes.Oeste) == LocalizacionParedes.Oeste)
                    {
                        Paredes ^= LocalizacionParedes.Oeste;
                    }
                }
            }
        }

        public void SwitchParedNorte()
        {
            Paredes ^= LocalizacionParedes.Norte;
        }

        public void SwitchParedSur()
        {
            Paredes ^= LocalizacionParedes.Sur;
        }

        public void SwitchParedEste()
        {
            Paredes ^= LocalizacionParedes.Este;
        }

        public void SwitchParedOeste()
        {
            Paredes ^= LocalizacionParedes.Oeste;
        }
    }
}
